﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using log4net;
using log4net.Config;
using ArxivatDeDocuments.ObjectesDeDades;

namespace ArxivatDeDocuments.ObjectesDeNegoci
{
    public class WorkflowController
    {

        private enum enumEstatWorkflow
        {             
            ComprovarConfiguracio,
            RecorrerDirectoris,
            OmplirDadesClients,
            ArxivarDocuments,
            Final
        }

        private List<Document> documentsTrobats;
        public static readonly ILog log = LogManager.GetLogger(typeof(WorkflowController));
        private enumEstatWorkflow EstatActual = enumEstatWorkflow.ComprovarConfiguracio;

        public void Start()
        {
            //try
            //{
            //    Application.EnableVisualStyles();
            //    Application.SetCompatibleTextRenderingDefault(false);
            //}
            //catch (Exception e)
            //{
            //    System.Diagnostics.Debug.Print(e.Message);
            //}

            XmlConfigurator.Configure();
            while (EstatActual != enumEstatWorkflow.Final)
            {
                runNextStep();
            }
        }

        private void runNextStep()
        {
            switch (EstatActual)
            {
                case enumEstatWorkflow.ComprovarConfiguracio:
                    ComprovarConfiguracioController comprovarConfiguracioController = new ComprovarConfiguracioController();
                    comprovarConfiguracioController.run();

                    if (comprovarConfiguracioController .ProximaAccio == Controller.enumProximaAccio.ProximPas)
                        EstatActual++;
                    else
                        TancarAplicacio();
                    break;

                case enumEstatWorkflow.RecorrerDirectoris:
                    RecorrerDirectorisController recorrerDirectorisController = new RecorrerDirectorisController();

                    recorrerDirectorisController.run();

                    if (recorrerDirectorisController.ProximaAccio == Controller.enumProximaAccio.ProximPas)
                    {
                        documentsTrobats = recorrerDirectorisController.documentsTrobats;
                        EstatActual++;
                    }
                    else
                        TancarAplicacio();
                    break;

                case enumEstatWorkflow.OmplirDadesClients:
                    OmplirNomsInexistentsController omplirNomsInexistentsController = new OmplirNomsInexistentsController(documentsTrobats);

                    omplirNomsInexistentsController.run();

                    if (omplirNomsInexistentsController.ProximaAccio == Controller.enumProximaAccio.ProximPas)
                    {
                        EstatActual++;
                    }
                    else
                        TancarAplicacio();
                    break;

                case enumEstatWorkflow.ArxivarDocuments:
                    if (MessageBox.Show("Atenció, estem a punt d'iniciar el procés d'arxivat. Segur que vols continuar ?", "Atenció", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == System.Windows.Forms.DialogResult.Yes)
                    {
                        ArxivarDocumentsController arxivarDocumentsController = new ArxivarDocumentsController(documentsTrobats);

                        arxivarDocumentsController.run();

                        if (arxivarDocumentsController.ProximaAccio == Controller.enumProximaAccio.ProximPas)
                        {
                            EstatActual++;
                            MessageBox.Show("Ha finalitzat el procés d'arxiu automàtic de documents.");
                        }
                        else
                            TancarAplicacio();
                    }
                    else
                        TancarAplicacio();
                    break;

                case enumEstatWorkflow.Final:
                    TancarAplicacio();
                    break;

            }

        }

        private void TancarAplicacio()
        {
            EstatActual = enumEstatWorkflow.Final;
        }

    }
}
